怕大家突然看到這篇會不知道為什麼跳到這部分,如果是新來的朋友想了解詳細流程,可以先回顧我之前第三天的文章:Day 3|Indexing pipeline:如何為 RAG 建立知識庫
在那篇文章裡,我提到文字會先被轉換成向量(Embeddings),再存到向量資料庫。
那麼問題來了:既然每段文字都變成了「座標點」,AI 又是怎麼判斷誰跟誰比較接近?
這就是我們今天要聊的主題——相似度的計算
在 RAG 的檢索過程中,最常見的計算方式有兩種:
1. 餘弦相似性(cosine similarity)
2. 歐幾里得距離
接下來我們就來看看它們各自的概念,以及為什麼會影響 AI 找資料的準確度。
維基百科(餘弦相似性)在這邊的解釋是——餘弦相似性通過測量兩個向量的夾角的餘弦值來度量它們之間的相似性。
這邊來想一下情境或許會更好理解。
- 如果我們在射箭,我們剛好都射到差不多中心點,那就代表我們射到的位置其實很近
- 假如一個射到中心,一個不小心射到右邊偏了,那是不是有點差距
- 再假設一個設在把上,一個直接轉身給後面的牆來個致命一擊,那是不是就差的可遠了
其實我想表示的不是距離的長短,而是方向性的問題(箭矢要射哪裡)。
想認真了解公式的夥伴也可以參考維基百科這張圖:
稍微解釋一下,分子是「兩個向量點積 = 看方向有多一致」,分母是「兩支箭的長度」→ 把大小影響消掉,只看角度,為了不讓大家看到覺得矇,就不針對細節多說了。
那再回到剛剛的例子,餘弦相似性的數值會界在 -1 到 1 之間。
- 兩條平行線(角度為 0°)的餘弦值為 1 (箭飛同一方向)
- 垂直線(角度為 90°)的餘弦值為 0 (箭一支往前、一支往側邊)
- 方向相反的向量(角度為 180°),餘弦值為 -1。 (有人反過來往後射)
不過要注意,剛好在 -1 跟 1 的情況是很少的,大多數的數值會落在 0 到 1 之間:
數值不會是負數主要也是跟訓練的方式有關,大部分「無關」的詞語會落在相近於 0 的地方,而不是完全相反的 -1,就算是對立詞,它們的上下文語境仍有重疊( 我愛你/我恨你。我__你 ),所以在 embedding 空間裡,它們通常也不會是 -1,而可能只是相似度偏低(接近 0)。
維基百科(歐幾里得距離)在這邊的解釋是——歐幾里得空間中兩點之間的歐幾里得距離(英語:Euclidean distance)是指連接這兩點的線段的長度。
這邊跟餘弦相似性就很不一樣,剛剛說了餘弦相似性是只看方向性的,而歐幾里得距離是只看距離。
最簡單的例子就是我們在地圖上放個尺量他們的距離。
想認真了解公式的夥伴也可以參考維基百科這張圖:
這邊只簡單介紹幾個常見的,或許後面可以再補充點其他的,今天先分享到這邊吧!